package com.insight.modules.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import com.insight.modules.system.entity.SysPermission;
import com.insight.modules.system.model.TreeModel;

import java.util.List;

/**
 * <p>
 * 菜单权限表 Mapper 接口
 * </p>
 *
 * @Author scott
 * @since 2018-12-21
 */
public interface SysPermissionMapper extends BaseMapper<SysPermission> {

	/**
	 * 通过父菜单ID查询该父菜单下所有子菜单
	 *
	 * @param parentId 父菜单ID
	 * @return 返回子菜单的列表，数据结构为 TreeModel
	 */
	List<TreeModel> queryListByParentId(@Param("parentId") String parentId);

	/**
	 * 根据权限ID查询权限信息
	 *
	 * @param id 权限ID
	 * @return 返回对应的 SysPermission 对象，如果不存在则返回 null
	 */
	SysPermission queryByPerId(@Param("id") String id);

	/**
	 * 根据用户名查询该用户拥有的所有权限列表
	 *
	 * @param username 用户名
	 * @return 返回用户对应的权限列表
	 */
	List<SysPermission> queryByUser(@Param("username") String username);

	/**
	 * 根据用户ID和权限状态查询该用户对应的权限类型列表
	 *
	 * @param userId 用户ID
	 * @param status 权限状态，true表示启用，false表示禁用
	 * @return 返回该用户拥有的权限类型列表
	 */
	List<SysPermission> queryPlatformTypeByUser(@Param("userId") String userId, @Param("status") Boolean status);

	/**
	 * 根据用户名和平台类型查询该用户对应的权限列表
	 *
	 * @param username     用户名
	 * @param platformType 平台类型编码，例如：1-管理后台，2-移动端等
	 * @return 返回用户在指定平台类型下的权限列表
	 */
	List<SysPermission> queryByUserAndPlatformType(@Param("username") String username, @Param("platformType") Integer platformType);

	/**
	 * 根据角色编码和平台类型查询对应权限列表
	 *
	 * @param roleCode     角色编码
	 * @param platformType 平台类型
	 * @return 返回匹配的权限列表
	 */
	List<SysPermission> queryByPlatformTypeAndRole(@Param("roleCode") String roleCode, @Param("platformType") Integer platformType);

	/**
	 * 修改菜单的叶子节点状态
	 *
	 * @param id   菜单ID
	 * @param leaf 是否为叶子节点，1表示是叶子节点，0表示不是
	 * @return 受影响的行数，通常为1
	 */
	@Update("update sys_permission set is_leaf=#{leaf} where id = #{id}")
	int setMenuLeaf(@Param("id") String id, @Param("leaf") int leaf);

	/**
	 * 查询权限表中包含模糊匹配符“*”的URL列表，用于数据权限校验
	 *
	 * @return 包含通配符“*”的权限URL列表
	 */
	@Select("SELECT url FROM sys_permission WHERE del_flag = 0 and menu_type = 2 and url like '%*%'")
	List<String> queryPermissionUrlWithStar();

	/**
	 * 根据用户名和权限实体条件，查询该用户对应权限的数量，用于权限校验或判断是否存在权限
	 *
	 * @param username   用户名
	 * @param permission 权限筛选条件，可以部分字段用于模糊匹配
	 * @return 权限匹配数量
	 */
	int queryCountByUsername(@Param("username") String username, @Param("permission") SysPermission permission);

	/**
	 * 根据权限URL查询权限信息
	 *
	 * @param url 权限URL
	 * @return 匹配的权限对象
	 */
	SysPermission queryByUrl(String url);

	/**
	 * 保存权限实体对象（插入新权限）
	 *
	 * @param sysPermission 权限实体对象
	 */
	void save(SysPermission sysPermission);

	/**
	 * 根据权限ID更新权限实体
	 *
	 * @param sysPermission 包含更新字段的权限实体对象，必须包含ID
	 */
	void updatePermissionById(SysPermission sysPermission);
}

